#ifndef POOL_HEAD_H
#define POOL_HEAD_H
#include <common_head.h>
#define MSG_LEN 1000
typedef struct data_msg{
    int len;
    char msg[MSG_LEN];
}data_t;
enum{
    BUSY,
    FREE
};
typedef struct process_status{
    pid_t pid; //子进程id
    int flag; //闲忙状态
    int local_sockfd; //与子进程通信的本地socket文件描述符
}process_t;

/**
 * @brief 初始化进程池
 * 
 * @param list 存储进程池中的相关信息
 * @param num 进程的个数
 * @return int 
 */
int init_pool(process_t *list, int num);

/**
 * @brief 初始化socket
 * 
 * @param sockfd 指向socket对象文件描述符的指针
 * @param port 端口
 * @param ip ip
 * @return int 
 */
int init_socket(int *sockfd, const char *port, const char *ip);

/**
 * @brief 将对应的文件描述符添加到epoll树上
 * 
 * @param epfd epoll树的文件描述符
 * @param fd 待添加文件描述符
 * @return int 
 */
int add_epoll(int epfd, int fd);

/**
 * @brief 将新连接的文件描述符发送给子进程
 * 
 * @param client_fd 客户端的文件描述符
 * @return int 
 */
int send_to_son(process_t *list,int client_fd,int num);

/**
 * @brief 发送消息的函数
 * 
 * @param locak_fd 持有的本地文件描述符 
 * @param new_fd 待发送的控制信息
 * @param flag 标记位
 * @return int 
 */
int send_message(int locak_fd,int new_fd, int flag);

/**
 * @brief 接收本地对端发送的数据
 * 
 * @param local_fd 当前持有的文件描述符
 * @param new_fd 指向对应文件描述符的指针
 * @param flag 指向标记位的指针
 * @return int 
 */
int recv_message(int local_fd,int *new_fd,int *flag);

/**
 * @brief 持有客户端的文件描述符，做相关工作
 * 
 * @param local_fd 当前端持有的本地文件描述符
 * @return int 
 */
int do_work(int local_fd);

/**
 * @brief 向客户端发送消息
 * 
 * @param client_fd 客户端的文件描述符
 * @return int 
 */
int translate_to_client(int client_fd);

/**
 * @brief 文件上传
 * 
 * @param client_fd 客户端文件描述符 
 * @param file_name 文件名
 * @return int 
 */
int upload(int client_fd, char *file_name);

/**
 * @brief 文件下载
 * 
 * @param client_fd 客户端文件描述符
 * @param file_name 文件名
 * @return int 
 */
int download(int client_fd, char *file_name);

/**
 * @brief 打印进度条
 * 
 * @param total_received 已传输字节数 
 * @param file_size 总字节数
 */
void print_progress_bar(size_t total_received,size_t file_size);

#endif